home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / docs / corsoguide / menu-19.txt < prev    next >
Text File  |  1992-09-03  |  10KB  |  169 lines

  1. I menù
  2.  
  3. I menù costituiscono una parte vitale del sistema, un mezzo importante per
  4. l'iterazione con l'utente; i menù (non ci riferiamo naturalmente a quelli
  5. del ristorante) servono ad indicare all'applicazione di compiere determinate
  6. azioni, o ad indicare determinati attributi (ad esempio grandezza, tipo e
  7. caratteristiche di un font da una lista); le stesse operazioni possono essere
  8. svolte da una finestra o un requester con una serie di gadgets, ma il gran
  9. vantaggio dei menù risiede nel fatto che sono a scomparsa, vale a dire che le
  10. opzioni non vengono normalmente mostrate sullo schermo, ma vengono
  11. visualizzate solo con la pressione del stato destro del mouse. Una volta
  12. premuto il tasto destro, apparirà al posto della barra titolo dello schermo
  13. una prima lista di opzioni indicanti i titoli dei menù; una volta selezionato
  14. uno di questi titoli, apparirà un box con una lista di elementi; selezionando
  15. uno di questi e rilasciando il pulsante del mouse, si indica all'applicazione
  16. di aver selezionato l'opzione indicata; l'opzione può però possedere a sua
  17. volta una sotto lista, in tal caso selezionando l'opzione apparirà affianco
  18. un'altra lista dando la possibiltà di selezionare un opzione ad un livello
  19. successivo; gli elementi che indicano gli attribuiti vengono
  20. contraddistinti con un checkmark (di solito un'immagine a forma di v) se
  21. selezionati. Ogni finestra può avere un suo menù anche se vengono
  22. visualizzati nello stesso punto (se le finestre sono presenti sullo stesso
  23. schermo), dato che solo una finestra può essere quella attiva. Gli elementi
  24. dei menù sono costituiti a livello grafico da un testo, da un'immagine o da
  25. tutti e due insieme. La principale limitazione dei menù risiede nel numero
  26. di opzioni e di livelli utilizzabili; il numero di livelli utilizzabili è 3
  27. (titoli menù, menù e sottomenù), ogni livello può possedere al massimo
  28. rispettivamente 31, 63 e 31 elementi.
  29. Per attivare un menù occorre utilizzare la funzione di Intuition:
  30.  
  31. ris = SetMenuStrip(finestra,menu);
  32.  
  33. dove finestra è il puntatore alla struttura Window della finestra
  34. in cui inserire il menù; menu è il puntatore alla struttura Menu
  35. contenente tutte le definizioni dei menù (vedremo fra breve come è
  36. strutturato); il valore ritornato "ris", è un BOOL che indica successo o
  37. fallimento; in realtà non può accadere che il menù non venga installato per
  38. cui la funzione ritorna sempre TRUE; la funzione invece per rimuovere un
  39. menù è:
  40.  
  41. ClearMenuStrip(finestra);
  42.  
  43. le due funzioni vanno chiamate all'inizio e all'uscita del programma
  44. (oppure nel momento in cui si decide di visualizzare e rimuovere il menù),
  45. ma comunque sempre dopo aver aperto la finestra e prima di chiuderla
  46. rispettivamente. Se si decide in un particolare momento, di cambiare la
  47. struttura del menù (opzioni visualizzate, disabilitate ecc.) occorre prima
  48. rimuovere il menù, effettuare le modifiche sulla relativa struttura, e
  49. riagganciare il menù alla finestra una volta effettuate tutte le modifiche;
  50. c'è la possibilità però di non usare necessariamente SetMenuStrip, se le
  51. modifiche effettuate sono solo l'abilitazione/disabilitazione di opzioni o la
  52. selezione/deselezione di attributi con checkmark; in tal caso la funzione
  53. utilizzabile per agganciare un menù (attenzione utilizzare solo se in
  54. passato è stata chiamata la funzione SetMenuStrip), che risulta essere
  55. molto più "leggera" è:
  56.  
  57. ris = ResetMenuStrip(finestra,menu);
  58.  
  59. dove i parametri passati e ricevuti ricoprono lo stesso significato prima
  60. descritto.
  61. Per disabilitare totalmente il menù (infatti anche quando nessun
  62. menù e agganciato, premendo il tasto destro appare la barra del menù),
  63. occorre specificare il flag WA_RMBTRAP nel tag WA_Flags di
  64. OpenWindowTagList(); questo flag non solo impedisce di visualizzare la
  65. barra titolo, ma permette anche di individuare la pressione del tasto
  66. destro, inviando un messaggio IDCMP_MOUSEBUTTONS. Una stessa struttura menù
  67. può essere condivisa ed utilizzata da più finestre, a condizione che le
  68. finestre siano presenti sullo stesso schermo; tenete presente che così
  69. facendo lo stesso menù apparirà per diverse finestre, a meno di non
  70. cambiarne la struttura all'attivazione di ognuna di queste
  71. (IDCMP_ACTIVEWINDOW); l'applicazione in tal caso deve anche attivare
  72. IDCMP_MENUVERIFY, in modo da impedire che l'utente utilizzi il menù di una
  73. finestra appena attivata, prima che l'applicazione abbia gestito l'evento
  74. IDCMP_ACTIVEWINDOW relativo.
  75. Una volta che l'utente rilascia un menù (anche senza aver selezionato alcuna
  76. opzione) il sistema invierà un messaggio di tipo IDCMP_MENUPICK; il codice
  77. dell'opzione eventualmente selezionata è presente nel campo Code della
  78. struttura IntuiMessage del messaggio di Intuition; il codice è di 16 bit ed
  79. è così suddiviso: i primi 5 bit (0-4) indicano il numero del menù, gli altri
  80. 6 bits (5-10) indicano il codice dell'opzione del menù e i restanti 5 bits
  81. (11-15) indicano il codice dell'opzione di un eventuale sotto-menù. Nel caso
  82. nessun opzione sia stata selezionata il valore Code, equivale ad una
  83. costante denominata MENUNULL; per prelevare i codici del menù, opzione e
  84. opzione del sotto-menù non è necessario andare ad esaminare direttamente i
  85. bit di Code, basta semplicemente utilizzare le seguenti macro sempre
  86. definite in "intuition/intuition.h": MENUNUM(Code) restituisce il numero del
  87. menù, ITEMNUM(Code) restituisce il numero dell'opzione, SUBNUM(Code)
  88. restituisce il numero dell'oipzione del sotto-menù; i valori restitui partono
  89. da 0 (primo menù o opzione), 1 (secondo menu' o opzione) e arrivano fino 30 o
  90. 62 (31-esima o 63-esima opzione o menù).
  91. Come ben sapete utilizzando quotidianamente Amiga, è possibile effettuare la
  92. multi-selezione nei menù; ciò significa che mentre gironzolo per i menù
  93. mantenendo premuto il tasto destro, posso selezionare più opzioni premendo il
  94. tasto sinistro; il sistema genererà in tal caso sempre un solo messaggio
  95. IDCMP_MENUPICK, ma come individuare tutte le opzioni selezionate allora? Il
  96. codice ritornato si riferisce ad uno degli elementi selezionati, nel campo
  97. NextSelect della struttura MenuItem dell'opzione relativa, s itroverà il
  98. codice di un'altra opzione selezionata, e così via fino a  quando il campo
  99. NextSelect non vale MENUNULL; rimane a questo punto il problema di come
  100. determinare l'indirizzo di una struttura MenuItem partendo dal codice; il
  101. sistema ci viene in soccorso con la seguente funzione:
  102.  
  103. Opzione = ItemAddress(menu,codicemenu);
  104.  
  105. dove menu è il puntatore alla struttura Menu del menù, codice è il codice
  106. dell'opzione selezionata e Opzione è il puntatore alla struttura MenuItem
  107. dell'opzione relativa. Dopo quanto detto il ciclo di programma per
  108. l'esaminazione delle selezioni per i menù è il seguente:
  109.  
  110. struct IntuiMessage *msg;
  111. struct Menu *menu;
  112. UWORD CodiceMenu;
  113. struct MenuItem *Opzione;
  114.   .
  115.   .
  116. CodiceMenu = msg -> Code;
  117. while (CodiceMenu != MENUNULL)
  118. {
  119.   Opzione = ItemAddress(menu,CodiceMenu);
  120.  
  121.   /* processo l'attuale opzione */
  122.  
  123.   CodiceMenu = Opzione -> NextSelect;
  124. }
  125.  
  126. E' possibile dalla V37 del sistema far indicare se l'utente desidera avere
  127. delle informazioni sull'azione compiuta dall'opzione del menù; infatti
  128. l'utente mentre seleziona un'opzione del menù, può premere il tasto HELP;
  129. in tal caso il sistema si comporterà come se l'utente avesse effettivamente
  130. selezionato ma, invece di inviare un messaggio di tipo IDCMP_MENUPICK, ne
  131. invierà uno di tipo IDCMP_MENUHELP, e verrà passato nel campo Code il
  132. codice dell'opzione relativa; in questo caso l'applicazione (ciò non è
  133. ovviamente obbligatorio) dovrà visualizzare le informazioni di aiuto per
  134. quella opzione.
  135. Nell'inizializzazione delle strutture Menu e MenuItem, occorre
  136. indicare il box di selezione dell'opzione o del titolo del menù;
  137. bisogna far attenzione nel considerare la grandezza del font quando si
  138. decide la grandezza del box e inoltre, bisogna stare attenti (questo per
  139. versioni del sistema prima della V37) che i box di opzioni successive siano
  140. adiacenti; il box contenente le opzioni del menù verrà automaticamente
  141. dimensionato dal sistema ed il box del sotto-menù può sovrapporsi al box
  142. del menù; esiste in realtà un modo più semplice per realizzare menù e
  143. gadget ed è la gadtools.library che vedremo in una delle prossime puntate.
  144. Come abbiamo già detto le opzioni possono essere di tipo attributo; ciò
  145. vuol dire che un'opzione può essere selezionata o deselezionata indicando
  146. così uno stato (attivo o disattivo); per specificare che un'opzione è di
  147. tipo attributo bisogna indicare il flag CHECKIT nel campo Flags della
  148. relativa struttura MenuItem; se l'opzione è selezionata, verrà attivato il
  149. flag CHECKED sempre nel campo Flags. Normalmente quando si sceglie
  150. un'opzione attributo questa viene sempre selezionata, indipendentemente
  151. dallo stato in cui si trova; se si specifica il flag MENUTOGGLE verrà
  152. invertito lo stato attuale; è possibile effettuare la mutua-esclusione fra
  153. opzioni attributo, in maniera che selezionando un'opzione è possibile
  154. deselezionarne altre; ciò è reso possibile dal campo MutualExclude; questo
  155. è un campo di tipo LONG, in cui ogni bit rappresenta un'opzione (bit 0
  156. prima opzione, bit 1 seconda opzione ecc.); al momento della selezione, le
  157. opzioni i cui rispettivi bit sono impostati ad uno verranno deselezionate.
  158. Vediamo un esempio per comprendere meglio questo meccanismo, supponiamo
  159. infatti di dover specificare mediante menù lo stile di un testo, i campi
  160. con i relativi valori di mutual-exclude saranno:
  161. Plain     0xFFFE
  162. Bold      0x0001
  163. Italic    0x0001
  164. Underline 0x0001
  165. in tale maniera se seleziono Plain, resetterò tutte le altre opzioni fuorché
  166. se stessa (infatti tutti i bit con posizione maggiore di 0 sono impostati ad
  167. 1, mentre il bit 0 a 0); se seleziono Bold, Italic o Underline disattiverò
  168. solamente la prima opzione (Plain) in quanto solo il bit 0 è impostato a 1.
  169.